package com.xiye.common.util.mail;

import com.xiye.common.controller.BaseController;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Date;
import java.util.Properties;

/**
 * @author 西野
 * @version V1.0
 * @title SimpleMailSender.java
 * @package com.xiye.common.util.mail
 * @description 邮件发送器
 * @date 2018-07-21
 */
public class SimpleMailSender extends BaseController {

    /*
     * @Author 西野
     * @Date 2018-07-21 11:54:09
     * @Description 以文本格式发送邮件
     * @Param [mailInfo] mailInfo 待发送的邮件的信息
     * @Return boolean
     */
    public boolean sendTextMail(MailSenderInfo mailInfo) throws Exception {
        // 判断是否需要身份认证
        MyAuthenticator authenticator = null;
        Properties pro = mailInfo.getProperties();
        if (mailInfo.isValidate()) {
            // 如果需要身份认证，则创建一个密码验证器
            authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
        }
        // 根据邮件会话属性和密码验证器构造一个发送邮件的session
        Session sendMailSession = Session.getDefaultInstance(pro, authenticator);
        logBefore(logger, "构造一个发送邮件的session");
        // 根据session创建一个邮件消息
        Message mailMessage = new MimeMessage(sendMailSession);
        // 创建邮件发送者地址
        Address from = new InternetAddress(mailInfo.getFromAddress());
        // 设置邮件消息的发送者
        mailMessage.setFrom(from);
        // 创建邮件的接收者地址，并设置到邮件消息中
        Address to = new InternetAddress(mailInfo.getToAddress());
        mailMessage.setRecipient(Message.RecipientType.TO, to);
        // 设置邮件消息的主题
        mailMessage.setSubject(mailInfo.getSubject());
        // 设置邮件消息发送的时间
        mailMessage.setSentDate(new Date());
        // 设置邮件消息的主要内容
        String mailContent = mailInfo.getContent();
        mailMessage.setText(mailContent);
        // 发送邮件
        Transport.send(mailMessage);
        logBefore(logger, "发送成功！");
        return true;
    }

    /*
     * @Author 西野
     * @Date 2018-07-21 11:54:26
     * @Description 以HTML格式发送邮件
     * @Param [mailInfo] mailInfo 待发送的邮件信息
     * @Return boolean
     */
    public boolean sendHtmlMail(MailSenderInfo mailInfo) throws Exception {
        // 判断是否需要身份认证
        MyAuthenticator authenticator = null;
        Properties pro = mailInfo.getProperties();
        // 如果需要身份认证，则创建一个密码验证器
        if (mailInfo.isValidate()) {
            authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
        }
        // 根据邮件会话属性和密码验证器构造一个发送邮件的session
        Session sendMailSession = Session.getDefaultInstance(pro, authenticator);
        // 根据session创建一个邮件消息
        Message mailMessage = new MimeMessage(sendMailSession);
        // 创建邮件发送者地址
        Address from = new InternetAddress(mailInfo.getFromAddress());
        // 设置邮件消息的发送者
        mailMessage.setFrom(from);
        // 创建邮件的接收者地址，并设置到邮件消息中
        Address to = new InternetAddress(mailInfo.getToAddress());
        // Message.RecipientType.TO属性表示接收者的类型为TO
        mailMessage.setRecipient(Message.RecipientType.TO, to);
        // 设置邮件消息的主题
        mailMessage.setSubject(mailInfo.getSubject());
        // 设置邮件消息发送的时间
        mailMessage.setSentDate(new Date());
        // MiniMultipart类是一个容器类，包含MimeBodyPart类型的对象
        Multipart mainPart = new MimeMultipart();
        // 创建一个包含HTML内容的MimeBodyPart
        BodyPart html = new MimeBodyPart();
        // 设置HTML内容
        html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");
        mainPart.addBodyPart(html);
        // 将MiniMultipart对象设置为邮件内容
        mailMessage.setContent(mainPart);
        // 发送邮件
        Transport.send(mailMessage);
        return true;
    }

    /*
     * @Author 西野
     * @Date 2018-07-21 11:54:39
     * @Description 设置邮件
     * @Param [title, content, type, tomail] title 标题;content 内容;type 类型,1:文本格式--2:html格式;tomail 接收的邮箱
     * @Return boolean
     */
    public boolean sendMail(String title, String content, String type, String tomail) throws Exception {

        // 这个类主要是设置邮件
        MailSenderInfo mailInfo = new MailSenderInfo();
        mailInfo.setMailServerHost("smtp.qq.com");
        mailInfo.setMailServerPort("25");
        mailInfo.setValidate(true);
        mailInfo.setUserName("itfather@1b23.com");
        mailInfo.setPassword("tttt");// 您的邮箱密码
        mailInfo.setFromAddress("itfather@1b23.com");
        mailInfo.setToAddress(tomail);
        mailInfo.setSubject(title);
        mailInfo.setContent(content);
        // 这个类主要来发送邮件
        SimpleMailSender sms = new SimpleMailSender();
        if ("1".equals(type)) {
            return sms.sendTextMail(mailInfo);// 发送文体格式
        } else if ("2".equals(type)) {
            return sms.sendHtmlMail(mailInfo);// 发送html格式
        }
        return false;
    }

    /*
     * @Author 西野
     * @Date 2018-07-21 11:55:22
     * @Description 方法描述
     * @Param [SMTP, PORT, EMAIL, PAW, toEMAIL, TITLE, CONTENT, TYPE] SMTP 邮件服务器;PORT 端口;EMAIL 本邮箱账号;
     *          PAW 本邮箱密码;toEMAIL 对方箱账号;TITLE 标题;CONTENT 内容;TYPE 1：文本格式;2：HTML格式;
     * @Return void
     */
    public static void sendEmail(String SMTP, String PORT, String EMAIL, String PAW, String toEMAIL, String TITLE, String CONTENT, String TYPE) throws Exception {
        // 这个类主要是设置邮件
        MailSenderInfo mailInfo = new MailSenderInfo();
        mailInfo.setMailServerHost(SMTP);
        mailInfo.setMailServerPort(PORT);
        mailInfo.setValidate(true);
        mailInfo.setUserName(EMAIL);
        mailInfo.setPassword(PAW);
        mailInfo.setFromAddress(EMAIL);
        mailInfo.setToAddress(toEMAIL);
        mailInfo.setSubject(TITLE);
        mailInfo.setContent(CONTENT);
        // 这个类主要来发送邮件
        SimpleMailSender sms = new SimpleMailSender();
        if ("1".equals(TYPE)) {
            sms.sendTextMail(mailInfo);
        } else {
            sms.sendHtmlMail(mailInfo);
        }

    }

    public static void main(String[] args) {
        // 这个类主要是设置邮件
        MailSenderInfo mailInfo = new MailSenderInfo();
        mailInfo.setMailServerHost("smtp.qq.com");
        mailInfo.setMailServerPort("587");
        mailInfo.setValidate(true);
        mailInfo.setUserName("89085055.com");
        mailInfo.setPassword("tttt");// 您的邮箱密码
        mailInfo.setFromAddress("yisilei1986@163.com");
        mailInfo.setToAddress("89085055@qq.com");
        mailInfo.setSubject("设置邮箱标题");
        mailInfo.setContent("设置邮箱内容");
        // 这个类主要来发送邮件
        // SimpleMailSender sms = new SimpleMailSender();
        // sms.sendTextMail(mailInfo);//发送文体格式
        // sms.sendHtmlMail(mailInfo);//发送html格式
    }

}
